package br.unicamp.ic.inf300.arena.modelo.vendas;
/**
 * Venda de Bilhetes Eletronicos para Espetaculos (Arena Entretenimento S.A.)
 * Bilhete.java
 */
import br.unicamp.ic.inf300.arena.modelo.logistico.Assento;
import br.unicamp.ic.inf300.arena.modelo.logistico.Evento;
import br.unicamp.ic.inf300.arena.modelo.pessoa.Espectador;

public abstract class Bilhete {
	public static final int ESTADO_RESERVA = 0;
	public static final int ESTADO_VENDIDO = 1;
	public static final int ESTADO_DEVOLVIDO = 2;
	//
	public static final int TIPO_INTEIRO = 0;
	public static final int TIPO_MEIA_ENTRADA = 1;

	private long numero;
	private int estado;
	private int tipo;
	private Espectador espectador;
	private Evento evento;
	private Venda venda;
	private Assento assento;
	private Estorno estorno;
	private String tipoView;

	/**
	 * 
	 * @param tipo
	 * @return String (tipo de Bilhete por extenso)
	 */
	public static String obterDescricaoTipoBilhete(int tipo) {
		String strDescricao = "";
		switch (tipo) {
		case TIPO_INTEIRO:
			strDescricao = " Inteira ";
			break;
		case TIPO_MEIA_ENTRADA:
			strDescricao = " 1/2 entrada ";
			break;
		default:
			break;
		}
		return strDescricao;
	}

	public Bilhete() {
		super();
	}
	
	/**
	 * 
	 * @param estado
	 * @param espectador
	 * @param evento
	 * @param venda
	 * @param assento
	 */
	public Bilhete(int estado, Espectador espectador,
			Evento evento, Venda venda, Assento assento) {
		super();
		this.estado = estado;
		this.espectador = espectador;
		this.evento = evento;
		this.venda = venda;
		this.assento = assento;
	}
	
	/**
	 * 
	 * @param numero
	 * @param estado
	 * @param espectador
	 * @param evento
	 * @param venda
	 * @param assento
	 */
	public Bilhete(long numero, int estado, Espectador espectador,
			Evento evento, Venda venda, Assento assento) {
		super();
		this.numero = numero;
		this.estado = estado;
		this.espectador = espectador;
		this.evento = evento;
		this.venda = venda;
		this.assento = assento;
	}

	/**
	 * 
	 * @param numero
	 * @param estado
	 * @param espectador
	 * @param evento
	 * @param venda
	 * @param assento
	 * @param estorno
	 */
	public Bilhete(long numero, int estado, Espectador espectador,
			Evento evento, Venda venda, Assento assento, Estorno estorno) {
		super();
		this.numero = numero;
		this.estado = estado;
		this.espectador = espectador;
		this.evento = evento;
		this.venda = venda;
		this.assento = assento;
		this.estorno = estorno;
	}

	/**
	 * IMPORTANTE: Este metodo deve ser sobrescrito pelas subclasses.
	 * Diferenciar valor para Meia-entrada e inteira.
	 * 
	 * @return double
	 */
	public double getValor() { return 0.00D; }

	public Venda getVenda() {
		return venda;
	}
	public void setVenda(Venda venda) {
		this.venda = venda;
	}

	public int getEstado() {
		return estado;
	}
	public void setEstado(int estado) {
		this.estado = estado;
	}

	public long getNumero() {
		return this.numero;
	}
	public void setNumero(long numero) {
		this.numero = numero;
	}

	public Assento getAssento() {
		return this.assento;
	}
	public void setAssento(Assento assento) {
		this.assento = assento;
	}

	public Espectador getEspectador() {
		return this.espectador;
	}
	public void setEspectador(Espectador espectador) {
		this.espectador = espectador;
	}

	public Evento getEvento() {
		return this.evento;
	}
	public void setEvento(Evento evento) {
		this.evento = evento;
	}

	public int getTipo() {
		return tipo;
	}
	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	public Estorno getEstorno() {
		return estorno;
	}
	public void setEstorno(Estorno estorno) {
		this.estorno = estorno;
	}

	public String getTipoView() {
		return obterDescricaoTipoBilhete( tipo );
	}
	public void setTipoView(String tipoView) {
		this.tipoView = tipoView;
	}

	/**
	 * @return <code>String</code>
	 * JUtils plugin ;-)
	 */
	public String toString()
	{
	    final String TAB = "    ";
	    
	    StringBuffer retValue = new StringBuffer();
	    
	    retValue.append("Bilhete ( ")
	        .append(super.toString()).append(TAB)
	        .append("assento = ").append(this.assento).append(TAB)
	        .append("espectador = ").append(this.espectador).append(TAB)
	        .append("estado = ").append(this.estado).append(TAB)
	        .append("estorno = ").append(this.estorno).append(TAB)
	        .append("evento = ").append(this.evento).append(TAB)
	        .append("numero = ").append(this.numero).append(TAB)
	        .append("tipo = ").append(this.tipo).append(TAB)
	        .append("tipoView = ").append(this.tipoView).append(TAB)
	        .append("venda = ").append(this.venda).append(TAB)
	        .append(" )");
	    
	    return retValue.toString();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + estado;
		result = prime * result + (int) (numero ^ (numero >>> 32));
		result = prime * result + tipo;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Bilhete other = (Bilhete) obj;
		if (estado != other.estado)
			return false;
		if (numero != other.numero)
			return false;
		if (tipo != other.tipo)
			return false;
		return true;
	}
}